package com.huxi.lang.validation.predicate;

import java.util.Objects;
import java.util.function.Predicate;

/**
 * 参数值判断条件
 * 
 * @since 1.0
 * @version 1.0
 * @author jian.wu
 *
 */

@FunctionalInterface
public interface VPredicate extends Predicate<Object> {

	/**
	 * 参数值条件测试
	 * 
	 * @param t                  参数值
	 * @param valueIfNull        参数值为{@code null}时，直接返回测试结果。
	 * @param valueIfIllegalType 参数值非条件期望类型时，直接返回测试结果。
	 * @return 参数值满足条件则返回{@code true}，否则返回{@code false}。
	 */
	boolean test(Object t, boolean valueIfNull, boolean valueIfIllegalType);

	@Override
	default boolean test(Object t) {
		return test(t, false, false);
	}

	default VPredicate and(VPredicate other) {
		Objects.requireNonNull(other);
		return (t, vin, vit) -> test(t, vin, vit) && other.test(t, vin, vit);
	}

	default VPredicate or(VPredicate other) {
		Objects.requireNonNull(other);
		return (t, vin, vit) -> test(t, vin, vit) || other.test(t, vin, vit);
	}

	/**
	 * JDBC条件操作参数是否为零
	 * 
	 * @return 操作参数为零返回{@code true}，否则返回{@code false}。
	 */
	default boolean zeroJdbcOperatorParameter() {
		return false;
	}

	/**
	 * 原子条件数量
	 * 
	 * @return 条件数量
	 */
	default int size() {
		return 1;
	}

	/**
	 * 原子条件数量是否为零
	 * 
	 * @return 条件数量为零返回{@code true}，否则返回{@code false}。
	 */
	default boolean isEmpty() {
		return size() == 0;
	}

	/**
	 * 条件设置为不可变条件
	 * 
	 * @param copy 需要拷贝原子条件列表
	 * @return 自身
	 */
	default VPredicate immutable(boolean copy) {
		return this;
	}

}
